// 装饰器：是一个特殊的类型，实质是一个函数，函数参数是根据装饰对象的不同参数也是不一样的，
//使用装饰器以@expression进行使用，装饰器目前是实验性的技术，所以在编译配置文件添加
//experimentalDecorators：true ，启用装饰器

// 如果在一个类前面添加一个装饰器：类装饰器，函数参数是类的构造函数
// 在一个类方法前添加一个装饰器：方法装饰器：函数参数是构造函数，方法名字、
//  如果写在一个属性前，是属性装饰器
// 如果写在函数的参数前，称之为参数装饰器

// 根据装饰对象不一样，功能也是不一样的 装饰器函数必须在装饰对象的上面

// 装饰类时，唯一的参数就是类的构造函数
function dec(con){
    console.log(con)
    con.prototype.say = function(){//前提是你要有say
        console.log("我是装饰器函数，可以通过参数是构造函数中添加say方法")
    }
}
// 类装饰器
@dec 
class AAA{
   name:string
   constructor(name){
       this.name = name
   } 
   say:Function//未实现
}
let a9 = new AAA("小明")
a9.say()

@dec
class BBB{
    name:string
    constructor(name){
        this.name = name
    } 
    say:Function
}
let bbb1 = new BBB("xx")
bbb1.say()


//方法修饰器
function hack(itsClass,itsName,descriptor) {   
     let oldValue = itsClass[itsName] // 正在修饰的方法 老方法
     const newDemo = function(){
         console.log("我是新方法",oldValue)//输出两句话
     }
     descriptor.value = newDemo
}
class CCC{
    name:string
    constructor(name){
        this.name = name
    } 
    @hack
    demo(){
        console.log("demo")
    }
}
let hk = new CCC("uhjj")
hk.demo()
